←
▼
▲
Sub BinaryArray::WriteFromBinaryArray( WriteOffset as integer,
ReadBinaryArray as BinaryArray, ReadOffset as integer, Size as integer )
バイナリ配列の一部を別のバイナリ配列に、高速にコピーします。
【引数】
Me
コピー先となるバイナリ配列
Me の中で変更する範囲の先頭位置。 配列の先頭から = 0
WriteOffset
(src)
ReadBinaryArray
ReadOffset
Size
コピー元となるバイナリ配列
ReadBinaryArray の中の範囲の先頭位置。 配列の先頭から = 0
コピーするサイズ(バイト), -1=最後まで
ReadBinaryArray のサイズより大きな値を Size 引数に指定したときは、最後までコピーします。
←
▼
▲
Sub BinaryArray::WriteFromDump( in_Offset as integer, in_Dump as string )
文字列にダンプされたバイナリーデータを、バイナリ配列の内容の一部に、ライトします。
【引数】
in_Offset
バイナリ配列の中で変更する範囲の先頭位置。 配列の先頭から = 0
バイナリーデータをダンプした文字列
in_Dump
サンプル
→ System.vbs
ソース
bin.WriteFromDump %h10, "0x05 | 0x14, 0x1234, 0x98765432"
'// bin = 0x0010 : 15 34 12 32 54 76 98
バイナリ配列 bin の 0 の位置に、vbByte型(8ビット整数型)の 0x12、0x34、0x56、0x78
を、格納します。
bin.WriteFromDump 0, "12 34 56 78"
'// bin = 0x0000 : 12 34 56 78
in_Dump 引数の中の、16進数と | 演算子以外は無視されます。 16進数は、接頭辞 0x を付けるか、
接頭辞を付けないでください。 | 演算子は、論理和です。
無視される文字を除き、16進数が連続すると次のデータであるとして処理します。
16進数の桁数がに応じて、整数のビット数が異なります。 2, 4, 8 桁なら、リトル エンディアンの
8, 16, 32 ビット整数になります。
テスト
T_Binary_FromDump
→ T_Binary.vbs
←
▼
▲
Function BinaryArray::Compare( ThanBinary as BinaryArray )
バイナリ配列を比較します。
【引数】
ThanBinary
比較対象のバイナリ配列
テスト
→ T_Binary.vbs
→ System.vbs
ソース
返り値
一致=0、StrComp と同じ
関連
←
▼
▲
Sub BinaryArray::SwapEndian( Offset as integer, Size as integer, SwapUnitSize as integer )
バイナリ配列の一部のエンディアンを逆にします。
【引数】
Offset
エンディアンを逆にする範囲の先頭オフセット
エンディアンを逆にする範囲のサイズ(バイト)
Size
サンプル
'// bin = 12 34 56 78 9A BC DE
bin.SwapEndian &h2, &h4, 2
'// bin = 12 56 34 9A 78 BC DE
バイナリ配列 bin の 0x2 の位置から始まる 4バイトの範囲を、2バイト単位(2バイト整数)で逆にします。
SwapUnitSize
逆にする単位
テスト
→ T_Binary.vbs
→ System.vbs
ソース
←
▼
▲
Sub BinaryArray::ToEmpty()
配列を空にします。 配列要素数は 0 になります。
←
▼
▲
←
▼
▲
<BinaryArray size="6">
FF FE 6F 30 80 30
</BinaryArray>
出力例:
(src)
←
▼
▲
echo ReadBinaryFile( "Sample.zip" ).MD5
バイナリー・データ(配列の全体)に対する ハッシュ値。
テスト
サンプル
ソース
→ System.vbs
→ T_Binary.vbs
→ MD5
関連
MD5 ハッシュ値は、0〜9, a〜f の文字が32文字の文字列になります。
SHA-1 ハッシュ値は、0〜9, a〜f の文字が40文字の文字列になります。
SHA-256 ハッシュ値は、0〜9, a〜f の文字が64文字の文字列になります。
Property Get BinaryArray::SHA1() as string
キーワード:
Property Get BinaryArray::SHA256() as string
SHA-256, SHA-384, SHA-512, RIPEMD-160 は、Windows Vista 以降で使えます。
Property Get BinaryArray::SHA384() as string
Property Get BinaryArray::SHA512() as string
SHA-384 ハッシュ値は、0〜9, a〜f の文字が96文字の文字列になります。
SHA-512 ハッシュ値は、0〜9, a〜f の文字が128文字の文字列になります。
RIPEMD-160 ハッシュ値は、0〜9, a〜f の文字が40文字の文字列になります。
Property Get BinaryArray::RIPEMD160() as string
→ ハッシュ値
5c1d447971bc0c49f09b2e965ac4ed37
… 表示例
文字列からハッシュ値を得る場合
→ PowerShell - MD5を計算する
ファイルの内容が異なれば、ハッシュ値も異なります。 内容が異なるのにハッシュ値が
同じになる(衝突する)確率はわずかにありますが、実用的には問題ありません。
ファイルの内容のごく一部だけ変えたときは、衝突しません。 なぜなら、衝突させるには、
ハッシュ アルゴリズムによって決まる法則で、ファイルの内容の全体を合わせる必要が
あるからです。
なお、ファイルのハッシュ値は、
でも確認できます。
注意
バイナリ ファイルのハッシュ値を計算するときは、
をお使い
ください。 ReadBinaryFile は、データをすべてリードしてからハッシュ値を計算
するため、メモリー不足が発生する可能性があります。
←
▼
▲
Sub Main()
Set c = g_VBS_Lib
path = InputPath( "zipファイルのパス >", c.CheckFileExists )
echo GetVersionString( path )
End Sub
Dim g_VersionDataBase : g_VersionDataBase = Array(_
"c28bae2972d4e9c9f90ed1861f0b8002", "vbslib, 4.00, 2012-07-02",_
"700af264a9f00733b4d26f0407625d5b", "vbslib, 4.01, 2013-02-14" )
Function GetVersionString( Path )
If IsArray( g_VersionDataBase ) Then _
Set g_VersionDataBase = Dict( g_VersionDataBase )
value_of_MD5 = ReadBinaryFile( Path ).MD5
If g_VersionDataBase.Exists( value_of_MD5 ) Then
GetVersionString = g_VersionDataBase( value_of_MD5 )
Else
GetVersionString = "Unknown"
End If
End Function
zip などのパッケージ・ファイルのバージョンを MD5 から判定するソース・コードのサンプル
を示します。
関連
←
▼
▲
Set bin = new_BinaryArrayFromBase64( "EjRWeA==" )
echo bin.Base64
バイナリー・データ(配列の全体)に対する Base64 でエンコードされた文字列。
サンプル
ソース
→ System.vbs
テスト
→ T_Binary.vbs
Test_of_Base64
関連
→ Base64
参考
←
▼
▲
バイナリー・データを指定した文字コードセットの文字列とし、VBScript の文字列を返します。
ソース
→ System.vbs
テスト
→ T_Binary.vbs
T_Binary_TextCharacterSet
関連
文字コードセット一覧
Set shift_JIS_bin = new_BinaryArray( Array( &h8A, &hBF, &h8E, &h9A ) )
Assert shift_JIS_bin.Text( "Shift-JIS" ) = "漢字"
サンプル
VBScript の文字列を指定した文字コードセットに変える
←
▼
▲
echo GetHashOfFile( "A.bin", "MD5" )
Function GetHashOfFile( in_Path as string, in_HashType as string ) as string
ファイルのハッシュ値を計算します。 内部で ADODB か Power Shell を使います。
【引数】
in_Path
in_HashType
ハッシュ値を計算するファイルのパス
ハッシュ値の種類
返り値
ファイルのハッシュ値
サンプル
ソース
in_HashType 引数に指定できる値は、"MD5", "SHA1", "SHA256", "SHA384", "SHA512",
"RIPEMD160" です。
→ System.vbs
内部の ADODB でメモリー不足が発生したら、Power Shell を使用します。
関連
←
▼
▲
echo GetHashPS( "A.bin", "MD5" )
Function GetHashPS( in_Path as string, in_HashType as string ) as string
ファイルのハッシュ値。 内部で Power Shell 使用。
【引数】
in_Path
in_HashType
ハッシュ値を計算するファイルのパス
ハッシュ値の種類
返り値
ファイルのハッシュ値
サンプル
ソース
in_HashType 引数に指定できる値は、"MD5", "SHA1", "SHA256", "SHA384", "SHA512",
"RIPEMD160" です。
→ System.vbs
←
▼
▲
→ RIFF 形式
WAV, AVI などの形式の一部にあたる、ツリー構造を持ったチャンクによって構成される
バイナリーデータ形式をリードします。
参考
Function OpenForReadRIFF( in_Path as string ) as RIFF_Reader
RIFF 形式バイナリーファイルのリードを開始します。
【引数】
入力ファイルのパス
in_Path
返り値
内容をリードするときに使うオブジェクト
Set bin = OpenForReadRIFF( "riff.bin" )
Set chunk = bin.ReadFirstChild() '// chunk as RIFF_ChunkClass
Assert chunk.FourCC = "Set "
Assert bin.Stack( 0 ).FourCC = "Root"
Assert bin.Stack( 1 ).FourCC = "Set "
Set chunk = bin.ReadFirstChild()
Assert chunk.FourCC = "Elem"
Assert chunk.Size = 5
Assert not chunk.IsExistChild
Assert not chunk.IsExistNextSibling
bin.ReadStruct data, Array( _
"a", vbByte+vbArray, 3, "b", vbInteger ) )
Assert data("a")(0) = &h41
Assert data("a")(1) = &h42
Assert data("a")(2) = &h43
Assert data("b") = &h4544 '// リトルエンディアン
bin.ReturnToParent
Set chunk = bin.ReadNextSibling()
Assert chunk.FourCC = "Elm2"
サンプル
RIFF( 'Root'
LIST( 'Set '
'Elem'( &h41, &h42, &h43, &h44, &h45 )
)
'Elm2'( &h58, &h59, &h5A )
)
上記のスクリプトは、下記のツリー構造をたどっています。
→ System.vbs
ソース
テスト
→ T_Binary.vbs
←
▼
▲
Function RIFF_Reader::SeekChunkByIndexes( in_Empty as Empty,
in_Indexes0_Array as array of integer ) as RIFF_ChunkClass
インデックス番号で指定したチャンクにジャンプして、リードします。
【引数】
in_Empty
Empty = ルート チャンクからたどる
テスト
→ T_Binary.vbs
T_RIFF_SeekChunkByIndexes
ソース
→ System.vbs
リードしたチャンクに関する情報
返り値
in_Indexes0_Array
インデックス番号の配列
RIFF チャンク
LIST チャンク
要素チャンク
要素チャンク
要素チャンク
要素チャンク
サンプル
Set chunk = a_RIFF.SeekChunkByIndexes( Empty, Array( 2, 0 ) )
Array( )
in_Indexes0_Array 引数の位置関係:
Array( 0 )
Array( 1 )
Array( 2 )
Array( 2, 0 )
Array( 2, 1 )
←
▼
▲
Function RIFF_Reader::ReadFirstChild() as RIFF_ChunkClass
現在位置にあるリスト チャンクの、子チャンクのヘッダーをリードします。
【引数】
返り値
リードした子チャンクに関する情報
::IsExistChild = False のときに呼び出すとエラーになります。
←
▼
▲
Function RIFF_Reader::ReadNextSibling() as RIFF_ChunkClass
現在位置の次の兄弟チャンクのヘッダーをリードします。
【引数】
返り値
リードした兄弟チャンクに関する情報
::IsExistNextSibling = False のときに呼び出すとエラーになります。
←
▼
▲
Function RIFF_Reader::ReadStruct( out_Dic as dictionary,
FormatArray as integer ) as integer
現在位置のチャンクの内容をリードし、辞書に格納します。
【引数】
(出力) チャンクの内容が入った辞書
out_Dic
返り値
抽出した部分のバイナリの大きさ(バイト)
バイナリ配列から抽出する部分の型の集合
FormatArray
参考
←
▼
▲
Function RIFF_Reader::ReturnToParent() as RIFF_ChunkClass
現在位置を親チャンクに移動します。
【引数】
返り値
親チャンクに関する情報
←
▼
▲
.Offset
.FourCC
チャンクのヘッダーをリードして得られたチャンクに関する情報。
.Size
.IsExistChild
.IsExistNextSibling
チャンクの先頭の位置。 0 が先頭
チャンクの名前に相当する FourCC (4文字の文字列)
チャンクに入っているデータのサイズ(バイト)
子チャンクがあるかどうか
次の兄弟チャンクがあるかどうか
←
▼
▲
→ RIFF 形式
WAV, AVI などの形式の一部にあたる、ツリー構造を持ったチャンクによって構成される
バイナリーデータ形式を作成します。
参考
Set w_=AppKey.NewWritable( "." ).Enable()
Set bin = OpenForWriteRIFF( "riff.bin", "Root" )
bin.WriteLIST "Set "
bin.WriteChunk "Elem"
bin.WriteStruct Array( vbByte, Array( &h41, &h42, &h43 ) )
bin.WriteStruct Array( vbInteger, Array( &h4544 ) )
bin.WriteEnd '// End of "Elem" chunk
bin.WriteEnd '// End of "Set " chunk
bin.WriteChunk "Elm2"
bin.WriteStruct Array( vbByte, Array( &h58, &h59, &h5A ) )
bin = Empty
サンプル
RIFF( 'Root'
LIST( 'Set '
'Elem'( &h41, &h42, &h43, &h44, &h45 )
)
'Elm2'( &h58, &h59, &h5A )
)
52 49 46 46 2A 00 00 00 52 6F 6F 74
4C 49 53 54 12 00 00 00 53 65 74 20
45 6C 65 6D 05 00 00 00 41 42 43 44 45 00
45 6C 6D 32 03 00 00 00 58 59 5A 00
RIFF 0x0000002A Root
LIST 0x00000012 Set
Elem 0x00000005 0x41 0x42 0x43 0x44 0x45
Elm2 0x00000003 0x58, 0x59, 0x5A
上記のスクリプトは、以下のバイナリーファイルを作ります。
Function OpenForWriteRIFF( in_Path as string, in_RootFourCC as string ) as RIFF_Writer
RIFF 形式バイナリーファイルのライトを開始します。
【引数】
出力ファイルのパス
in_Path
in_RootFourCC
ルートチャンクの名前に相当する FourCC (4文字の文字列)
返り値
内容をライトするときに使うオブジェクト
テスト
→ System.vbs
ソース
→ T_Binary.vbs
←
▼
▲
Sub RIFF_Writer::WriteLIST( in_FourCC as string )
リスト チャンクのヘッダーを出力します。
【引数】
in_FourCC
出力するリスト チャンクの名前に相当する FourCC (4文字の文字列)
次は、
リストを終了するときは、
WriteEnd
を呼び出してください。
WriteLIST
か
のどちらかのチャンクのヘッダーをライトします。
←
▼
▲
Sub RIFF_Writer::WriteLIST( in_FourCC as string )
リスト以外のチャンクのヘッダーを出力します。
【引数】
in_FourCC
出力するチャンクの名前に相当する FourCC (4文字の文字列)
次は、
でライトします。
←
▼
▲
Sub RIFF_Writer::WriteStruct( FormatAndDataArray as array )
構造化した配列を使って、現在のチャンクに、バイナリーデータをライトします。
【引数】
連続して WriteStruct を呼び出すと、同じチャンクの中の続きをライトします。
バイナリ配列へライトする部分の型とライトする値の集合
FormatAndDataArray
参考
でチャンク(のサイズ)を確定します。
←
▼
▲
Sub RIFF_Writer::WriteEnd()
チャンクのサイズを確定します。 現在のチャンクのライトを終了したときに呼び出します。
または
でライトしたチャンクのヘッダーの一部にある
サイズ情報の部分に、適切な値をライトします。
か
のどちらかを呼び出したときは、
WriteEnd を呼び出す前のチャンクの親の兄弟のチャンクがライトされます。
本関数を呼び出した後で、
本関数は、
ルートのチャンクになるまで、WriteEnd を呼び出す必要はありません。 RIFF_Writer クラス
のオブジェクトが削除されるタイミングで、足りなかった WriteEnd 呼び出しを内部で自動
的に行い、OpenForWriteRIFF 関数の引数に指定したファイルに出力します。
←
▼
▲
Sub RIFF_Writer::WritePadding( in_FourCC as string, in_Alignment as integer )
次のバイナリーデータのアラインメントを揃えるために、パディングするチャンクをライトします。
【引数】
in_FourCC
in_Alignment
パディングをするチャンクの FourCC
アラインメント
→ チャンクの中のデータの先頭をアラインメントするには
参考
:
'Pad ' FourCC ... ライトする範囲の最初
padding_size
padding ... ライトする範囲の最後
'Data' FourCC ... WritaStruct 関数でライト
data_size
data ... アラインメントが揃う位置
下記の data のアラインメントを揃えるために、下記の 'Pad ' チャンクをライトします。
←
▼
▲
テスト
ソース
→ T_LeafPath.vbs
T_FileHashCache
→ ToolsLib.vbs
ファイルのハッシュ値(MD5)のキャッシュ。
キーはフル パス、アイテムはハッシュ値(リード オンリー)である辞書。
プロセス起動後、初めて指定されたファイルのときだけ、ハッシュ値を計算します。
大量のファイルを何度も比較するときに使うと、高速になります。
Assert g_FileHashCache( "C:\A.txt" ) = "9060587edeb01a63e3d3edc959678d1e"
参考
g_FileHashCache に入るオブジェクトは、ToolsLib.vbs を include するときに作成されます。
キーがフォルダーのパスのときのアイテムは、"Folder" です。
ただし、フォルダーが空のときは、"EmptyFolder" です。
キーがファイルやフォルダーのパスではないときのアイテムは、"" です。
ファイルの変更があったときは、Remove メソッド、RemoveAll メソッドでキャッシュを破棄してください。
g_FileHashCache.RemoveAll
g_FileHashCache.CopyRenFile "Source.txt", "Destination.txt"
ハッシュ値の計算と、ファイルのコピーを同時にするときは、CopyRenFile を呼び出します。
ファイルの削除と同時に、キャッシュを更新するときは、DeleteFile を呼び出します。
g_FileHashCache.DeleteFile "File.txt"
g_FileHashCache.Remove "File.txt"